// // Functor 函子
// class Container {
//   constructor (value) {
//     this._value = value
//   }

//   map (fn) {
//     return new Container(fn(this._value))
//   }
// }

// let r = new Container(5)
//   .map(x => x + 1)
//   .map(x => x * x)

// console.log(r)

class Container {
  static of(value) {
    return new Container(value);
  }

  constructor(value) {
    this._value = value;
  }

  map(fn) {
    return Container.of(fn(this._value));
  }
}

// let r = Container.of(5)
//           .map(x => x + 2)
//           .map(x => x * x)

// console.log(r)

// 演示 null undefined 的问题
Container.of(null).map((x) => x.toUpperCase());

// 函数式编程  不操作 原始值，而是通过给函子传递函数，由函子来完成
// 函子就是一个实现了  map契约 的一个对象
// 函子就是接收原始值 通过map接收纯函数来对这个值进行处理
// 函子的 map 方法最终又返回一个新值的函子
